package es.ucm.pe.algorithms;

public class AB {
	
	private AB hijoDch;
	private AB hijoIzq;
	private char dato;
	private int nivel;
	private AB padre;
	private boolean esHijoIzq;

	public AB() {
		nivel = 0;
		hijoDch = null;
		hijoIzq = null;
		padre = null;
	}
	
	public AB(char dato) {
		hijoDch = null;
		hijoIzq = null;
		this.dato = dato;
	}
	
	public AB(char dato, AB hijoIzq, AB hijoDch) {
		this.dato = dato;
		this.hijoDch = hijoDch;
		this.hijoIzq = hijoIzq;
	}

	public AB getHijoDch() {
		return hijoDch;
	}

	public void setHijoDch(AB hijoDch) {
		this.hijoDch = hijoDch;
	}

	public AB getHijoIzq() {
		return hijoIzq;
	}

	public void setHijoIzq(AB hijoIzq) {
		this.hijoIzq = hijoIzq;
	}

	public char getDato() {
		return dato;
	}

	public void setDato(char dato) {
		this.dato = dato;
	}
	
	public AB clone(AB padre) {
		AB result = new AB(dato);
		result.setNivel(nivel);
		result.setPadre(padre);
		result.setEsHijoIzq(esHijoIzq);
		if(hijoIzq != null){
			result.setHijoIzq(hijoIzq.clone(result));
		}
		if(hijoDch != null){
			result.setHijoDch(hijoDch.clone(result));
		}
		return result;
	}

	public int getNivel() {
		return nivel;
	}

	public void setNivel(int nivel) {
		this.nivel = nivel;
	}
	
	public AB getPadre() {
		return padre;
	}

	public void setPadre(AB padre) {
		this.padre = padre;
	}
	
	public boolean esHijoIzq() {
		return esHijoIzq;
	}

	public void setEsHijoIzq(boolean esHijoIzq) {
		this.esHijoIzq = esHijoIzq;
	}
	
	public void setNiveles(int nivel) {
		this.nivel = nivel;
		int nuevoNivel = nivel + 1;
		if(hijoDch!=null) {
			hijoDch.setNiveles(nuevoNivel);
		}
		if(hijoIzq!=null) {
			hijoIzq.setNiveles(nuevoNivel);
		}
	}
	
	public int calcularProfundidad(){
		if(hijoIzq !=null) {
			if(hijoDch!=null){
				return 1 + Math.max(hijoIzq.calcularProfundidad(), hijoDch.calcularProfundidad());
			}else{
				return 1 + hijoIzq.calcularProfundidad();
			}
		}else{
			if(hijoDch!=null){
				return 1 + hijoDch.calcularProfundidad();
			}else{
				return 1;
			}
		}
		
	}

}
